#!/usr/bin/env python
# -*- coding: utf-8 -*-

from tkinter import *
import tkinter.messagebox as messagebox
import time
import HttpServer
import SysTrayIcon

window_width=480
window_height=500
LOG_LINE_NUM = 0
web_port=9000
this_http_server=None
systrayIconObj = None
init_window=None

class main_gui():
    '''主界面类'''
    def __init__(self,this_window, toTrayIconFun):
        self.this_window = this_window
        self.toTrayIconFun=toTrayIconFun

        '''界面类容  '''
        # 说明书
        self.init_desc_label = Label(self.this_window, fg="red", text="将此文件放到任意目录，①打开软件，②设置端口号，③点击启动 即可启动web服务。")
        self.init_desc_label.grid(row=0, column=0, rowspan=1, columnspan=6)
        # 端口文字
        self.init_port_label = Label(self.this_window, text="WEB端口：")
        self.init_port_label.grid(row=1, column=0)
        # 端口输入文本框
        self.init_port_Text = Entry(self.this_window, textvariable=StringVar(value=web_port))  # 原始数据录入框
        self.init_port_Text.grid(row=1, column=1, rowspan=1, columnspan=1)

        # 启动 按钮
        self.start_server_button = Button(self.this_window, text="启动WEB服务", bg="lightblue", width=10,
                                          command=self.start_server)  # 调用内部方法  加()为直接调用
        self.start_server_button.grid(row=1, column=2, rowspan=1, columnspan=1)
        # 隐藏到图标
        self.hide_server_button = Button(self.this_window, text="托盘隐藏", bg="lightblue", width=10,
                                         command=self.toTrayIconFun)  # 调用内部方法  加()为直接调用
        self.hide_server_button.grid(row=1, column=3)

        # 日志
        self.log_data_label = Label(self.this_window, text="日志类容：")
        self.log_data_label.grid(row=3, column=0, rowspan=1, columnspan=6)

        # 日志
        self.log_data_Text = Text(self.this_window, width=66, height=29)  # 日志框
        self.log_data_Text.grid(row=4, column=0, columnspan=6)

        # 清空日志
        self.start_server_button = Button(self.this_window, text="清空日志", bg="lightblue", width=10,
                                          command=self.clear_log)  # 调用内部方法  加()为直接调用
        self.start_server_button.grid(row=5, column=0, columnspan=6)


    #隐藏到托盘
    def hide_to_stock(self):
        pass

    # 日志动态打印
    def write_log_to_Text(self, logmsg,err=None):
        print(f" 日志：{logmsg}",err)
        current_time = self.get_current_time()
        logmsg_in = str(current_time) + " " + str(logmsg) + "\n"  # 换行
        self.log_data_Text.insert("insert", logmsg_in)
        if err !=None:
            self.log_data_Text.insert("insert", f"{err}" + "\n")
        self.log_data_Text.update()

    # 清空日志
    def clear_log(self):
        self.log_data_Text.delete(1.0, END)
        self.log_data_Text.update()

    def start_server(self):
        iport  = self.init_port_Text.get().strip().replace("\n", "")
        if not iport.isdigit() or (int(iport)<=0 or 65000<=int(iport)):
            messagebox.showerror(title = '端口错误',message='端口必须是数字，且只能填写1-65000之中的数字。')
            return
        web_port=int(iport)
        print(f" 新端口：{web_port}")
        global this_http_server
        if this_http_server :
            this_http_server.close_server()

        this_http_server = HttpServer.HttpServer(web_port,self.write_log_to_Text);

    #获取当前时间
    def get_current_time(self):
        current_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
        return current_time

def exit(s=None,_sysTrayIcon=None):
    global init_window
    init_window.destroy()# 退出界面loop，退出进程
    print('exit...')

def Hidden_window(icon='icon.ico', hover_text="静态文件服务器"):
        '''隐藏窗口至托盘区，调用SysTrayIcon的重要函数'''
        # 托盘图标右键菜单, 格式: ('name', None, callback),下面也是二级菜单的例子
        # 24行有自动添加‘退出’，不需要的可删除
        menu_options = ()
        init_window.withdraw()  # 隐藏tk窗口
        global systrayIconObj
        if not systrayIconObj:
            systrayIconObj = SysTrayIcon.SysTrayIcon(
                icon,  # 图标
                hover_text,  # 光标停留显示文字
                menu_options,  # 右键菜单
                on_quit=exit,  # 退出调用
                tk_window=init_window,  # Tk窗口
            )
        #创建托盘图标
        systrayIconObj.activation()


def gui_start():
    global init_window
    init_window = Tk()              #实例化出一个父窗口
    init_window.resizable(False, False)  # 窗口不可调整大小
    #init_window.iconbitmap("icon.ico") #icod不方便打包，所以不单独设置icon了，
    init_window.title("静态文件服务器")  # 窗口名
    init_window["bg"] = "#F0F0F0"  # 窗口背景色，其他背景色见：blog.csdn.net/chl0000/article/details/7657887
    init_window.attributes("-alpha", 1)  # 虚化，值越小虚化程度越高
    main_gui(init_window, Hidden_window)
    # 设置窗口初始大小和位置 window_width window_height为窗口大小，+10 +10 定义窗口弹出时的默认展示位置
    init_window.geometry('%dx%d+%d+%d' % (window_width, window_height, 300, 300))
    #绑定缩放托盘事件
    init_window.bind("<Unmap>",  lambda event: Hidden_window() if init_window.state() == 'iconic' else False)  # 窗口最小化判断，可以说是调用最重要的一步
    init_window.protocol('WM_DELETE_WINDOW', exit)  # 点击Tk窗口关闭时直接调用s.exit，不使用默认关闭
    init_window.update()  # 刷新窗口显示
    init_window.mainloop()          #父窗口进入事件循环，可以理解为保持窗口运行，否则界面不展示


if __name__ == "__main__":
    gui_start()